package com.xcm.dao;

import com.github.pagehelper.Page;
import com.xcm.model.TbDeviceInfo;
import com.xcm.model.dto.ApkDeviceListDTO;
import com.xcm.model.dto.DeviceInfoListDTO;
import com.xcm.model.vo.SingleDeviceReportVO;

import com.xcm.model.vo.WholeDeviceReportVO;
import org.apache.ibatis.annotations.Param;

import java.util.List;

public interface DeviceInfoMapper {
	/**
	 * 保存终端
	 *
	 * @param deviceInfo TbDeviceInfo类型对象
	 */
	void saveDeviceInfo(TbDeviceInfo deviceInfo);

	/**
	 * 通过mac获取终端
	 *
	 * @param deviceMac 终端Mac
	 * @return TbDeviceInfo
	 */
	TbDeviceInfo getDeviceInfoByMac(String deviceMac);

	/**
	 * 更新终端
	 *
	 * @param deviceInfo TbDeviceInfo类型对象
	 */
	void updateDeviceInfo(TbDeviceInfo deviceInfo);

	/**
	 * 终端分页列表
	 *
	 * @param groupCode    分组码
	 * @param deviceNum    终端机器码
	 * @param deviceIp     终端IP地址
	 * @param deviceMac    终端mac
	 * @param deviceStatus 终端状态
	 * @return Page<DeviceInfoListDTO>
	 */
	Page<DeviceInfoListDTO> listByPage(@Param("groupCode") String groupCode, @Param("deviceNum") String deviceNum, @Param("deviceIp") String deviceIp,
	                                   @Param("deviceMac") String deviceMac, @Param("deviceStatus") Integer deviceStatus);

	/***
	 * 修改终端机器码
	 * @param deviceInfoId  终端ID
	 * @param deviceNum 终端机器码
	 */
	void updateDeviceNum(@Param("deviceInfoId") Long deviceInfoId, @Param("deviceNum") String deviceNum);

	/**
	 * 获取所有终端Mac地址
	 *
	 * @return List<String>
	 */
	List<String> listAllDeviceMac();

	/**
	 * 通过终端id获取终端
	 *
	 * @param deviceInfoId 终端id
	 * @return TbDeviceInfo
	 */
	TbDeviceInfo getDeviceInfoById(Long deviceInfoId);

	/**
	 * 更新终端音量
	 *
	 * @param deviceVolume   音量
	 * @param deviceMacArray 终端Mac数组
	 */
	void updateDeviceVolumeByDeviceMacArray(@Param("deviceVolume") Integer deviceVolume, @Param("deviceMacArray") String[] deviceMacArray);

	/**
	 * 更新所有终端音量
	 *
	 * @param deviceVolume 音量
	 */
	void updateAllDeviceVolume(Integer deviceVolume);

	/**
	 * 通过分组码更新终端音量
	 *
	 * @param deviceVolume 音量
	 * @param groupCode    分组码
	 */
	void updateDeviceVolumeByGroupCode(@Param("deviceVolume") Integer deviceVolume, @Param("groupCode") String groupCode);

	/**
	 * 更新终端开关机时间
	 *
	 * @param useTimer
	 * @param bootTime       开机时间
	 * @param offTime        关机时间
	 * @param deviceMacArray 终端Mac数组
	 */
	void updateDeviceBootOffTimeByDeviceMacArray(@Param("useTimer") Integer useTimer, @Param("bootTime") Long bootTime,
	                                             @Param("offTime") Long offTime, @Param("deviceMacArray") String[] deviceMacArray);

	/**
	 * 更新所有终端开关机时间
	 *
	 * @param useTimer
	 * @param bootTime 开机时间
	 * @param offTime  关机时间
	 */
	void updateAllDeviceBootOffTime(@Param("useTimer") Integer useTimer, @Param("bootTime") Long bootTime, @Param("offTime") Long offTime);

	/**
	 * 根据分组码更新终端开关机时间
	 *
	 * @param useTimer
	 * @param bootTime 开机时间
	 * @param offTime  关机时间
	 */
	void updateDeviceBootOffTimeByGroupCode(@Param("useTimer") Integer useTimer, @Param("bootTime") Long bootTime, @Param("offTime") Long offTime,
	                                        @Param("groupCode") String groupCode);

	/**
	 * 通过终端MAC修改机器码
	 *
	 * @param deviceMac 终端mac地址
	 * @param deviceNum 机器码
	 */
	void updateDeviceNumByDeviceMac(@Param("deviceMac") String deviceMac, @Param("deviceNum") String deviceNum);

	/**
	 * 通过终端MAC设置音量
	 *
	 * @param deviceMac    终端Macs地址
	 * @param deviceVolume 音量
	 */
	void updateDeviceVolumeByDeviceMac(@Param("deviceMac") String deviceMac, @Param("deviceVolume") Integer deviceVolume);

	/**
	 * 获取分组码所属的终端Mac地址
	 *
	 * @param groupCode 分组码
	 * @return List<String>
	 */
	List<String> listDeviceMac(String groupCode);

	/**
	 * 通过终端状态 获取终端数量
	 *
	 * @param deviceStatus 终端状态
	 * @return Long
	 */
	Long getDeviceInfoCountByDeviceStatus(Integer deviceStatus);

	/**
	 * 通过机器编码和在线状态获取终端数量
	 * @param deviceNum
	 * @param deviceInfoStatusOnLine 0在线 1离线
	 * @return
	 */
	Long getDeviceInfoCountByDeviceStatusAndDeviceNum(@Param("deviceNum") String deviceNum, @Param("deviceStatus") int deviceInfoStatusOnLine);

	/**
	 * 通过IP地址和在线状态获取终端数量
	 * @param deviceIp
	 * @param deviceInfoStatusOnLine 0在线 1离线
	 * @return
	 */
	Long getDeviceInfoCountByDeviceStatusAndDeviceIP(@Param("deviceIp") String deviceIp, @Param("deviceStatus") int deviceInfoStatusOnLine);

	/**
	 * 通过MAC地址和在线状态获取终端数量
	 * @param deviceMac
	 * @param deviceInfoStatusOnLine 0在线 1离线
	 * @return
	 */
	Long getDeviceInfoCountByDeviceStatusAndDeviceMac(@Param("deviceMac") String deviceMac, @Param("deviceStatus") int deviceInfoStatusOnLine);

	/**
	 * 通过分组编码和在线状态获取终端数量
	 * @param groupCode
	 * @param deviceInfoStatusOnLine 0在线 1离线
	 * @return
	 */
	Long getDeviceInfoCountByDeviceStatusAndGroupCode(@Param("groupCode") String groupCode, @Param("deviceStatus") int deviceInfoStatusOnLine);

	/**
	 * 获取APK终端信息
	 * @param mipsVersion   mips版本
	 * @param deviceStatus  终端状态
	 * @param model 机型
	 * @param province  省
	 * @param city  市
	 * @param county    区
	 * @param groupCode 分组码
	 * @return  Page<ApkDeviceListDTO>
	 */
	Page<ApkDeviceListDTO> listApkDeviceByPage(@Param("mipsVersion") String mipsVersion, @Param("deviceStatus") Integer deviceStatus, @Param("model")String model,
	                                     @Param("province")String province, @Param("city")String city, @Param("county")String county, @Param("groupCode")String groupCode);
	/**
	 * 通过终端状态获取终端数量
	 * @param deviceStatus  终端状态
	 * @param mipsVersion   mips版本
	 * @param model 机型
	 * @param province  省
	 * @param city  市
	 * @param county    区
	 * @param groupCode 分组码
	 * @return  Page<ApkDeviceListDTO>
	 */
	Long getDeviceInfoCount(@Param("deviceStatus") Integer deviceStatus, @Param("mipsVersion") String mipsVersion, @Param("model")String model,@Param("province")String province,
	                          @Param("city")String city, @Param("county")String county, @Param("groupCode")String groupCode);
	/**
	 * 通过终端升级ids更新软件升级ID
	 * @param softwareUpgradeId   软件升级ID
	 * @param deviceInfoIdArray List<Integer>(终端ID列表)
	 */
	void updateSoftwareUpgradeIdByDeviceInfoIds(@Param("softwareUpgradeId") Long softwareUpgradeId, @Param("deviceInfoIdArray") String[] deviceInfoIdArray);

	Page<SingleDeviceReportVO> listSingleDeviceReport(@Param("startTime")Long startTime, @Param("endTime")Long endTime, @Param("deviceNum")String deviceNum,@Param("mac") String mac);
	/**
	 * 整体终端报表
	 *
	 * @param startTime 查询开始时间
	 * @param endTime 查询结束时间
	 * @param deviceNum 机器码
	 * @param mac mac地址
	 * @param deviceProvince 省
	 * @param deviceCity 市
	 * @param deviceCounty 区
	 * @param groupCode
	 * @return
	 */
	Page<WholeDeviceReportVO> listWholeDeviceReport(@Param("startTime") Long startTime, @Param("endTime") Long endTime,
													@Param("deviceNum") String deviceNum, @Param("mac") String mac,
													@Param("deviceProvince") String deviceProvince, @Param("deviceCity") String deviceCity,
													@Param("deviceCounty") String deviceCounty, @Param("groupCode") String groupCode);

	/**
	 * 将终端的分组Id置为空
	 * @param groupCode 终端的原分组编码
	 */
    void updateDeviceGroupNull(String groupCode);
}
